package com.kate.mall.bff.wx.java8;

import org.checkerframework.checker.units.qual.C;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * @author 新梦想.陈超
 * @version 2021.2
 * @Description: {TODO}
 * @date 2023/3/13 上午11:09
 */

class Apple {
    private String color;
    private Integer weight;

    public Apple(String color, Integer weight) {
        this.color = color;
        this.weight = weight;
    }

    public Apple() {
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Integer getWeight() {
        return weight;
    }

    public void setWeight(Integer weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "color='" + color + '\'' +
                ", weight=" + weight +
                '}';
    }
}

public class _01_Lambda {
    static List<Apple> appleList = Arrays.asList(new Apple("绿色", 100),
            new Apple("绿色", 80),
            new Apple("绿色", 20),
            new Apple("红色", 200),
            new Apple("红色", 170),
            new Apple("红色", 190));

    public static void main(String[] args) {
        //TODO 1.传统方式定义runable
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("我是线程执行的内容....");
                }
            }
        };
        //TODO 2.java 8 中引入lambda表达式
        // 在java 8存在->操作符
        // 左侧：Lambda表达式的参数列表（可以想象成，是上面定义的接口中抽象方法参数的列表）
        // 右侧：Lambda表达式中，所需要执行的功能，即Lambda体（需要对抽象方法实现的功能）
        /*
        TODO 1、无参，无返回值
        格式：
        () -> {System.out.println(“hello”);}
        如果lambda体(方法体)只有一条语句，那么{}可以省略
        Runnable java提供的函数式接口
     */
        Runnable runnable2 = () -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("我是线程执行的内容....");
            }
        };
        /*
        TODO 2、有一个参数，无返回值
        格式：

        (x) -> System.out.println(x);
        或  (一个参数时，小括号可以省略不写)
        x -> System.out.println(x);

        1）Consumer是Java8内部提供的一个函数接口
        2）MyFunction我们自己定义的函数式接口
        */
        Consumer<String> consumer = (x) -> System.out.println(x);

        MyFunction<Integer> myFunction = (a) -> System.out.println(a);
         /* TODO 3、有参数，有返回值
            1. 1个参数 有返回值
            1) jdk提供 Function
            2）自定义有参数，有返回的函数接口

            2.多个参数，有返回值
         */

        Function<Integer,Integer> f02 = (x)->{
            return x;
        };
        MyFunction2<Integer>  f03=(x)->{
            return x;
        };


    }

}

//自己定义一个函数接口
@FunctionalInterface
interface MyFunction<T> {
    void add(T a);
//    void a(T b);
}

//自己定义一个函数接口
@FunctionalInterface
interface MyFunction2<T> {
    T add(T a);
}


//比较器的实现类
class MyCompare implements Comparator<Apple> {
    /**
     * @param o1
     * @param o2
     * @return 返回值：负数，0，整数
     * 负数：第1个参数小于第2个参数
     * 0：第1个参数小于第2个参数
     * 整数：第1个参数大于第2个参数
     */
    @Override
    public int compare(Apple o1, Apple o2) {
        return 0;
    }
}
